class Node {
  constructor(element = "") {
    this.element = element;  // 表示节点上的数据
    this.next = null;   // 表示指向下一个节点的链接
  }
}

/**
 * Linked List class
 */
class LinkedList {
  /**
   * 构造器，初始化头节点
   */
  constructor() {
    /** @var LinkedListNode */
    this.head = null;

    /** @var LinkedListNode */
    this.tail = null;
  }

  /**
   * 根据指定值找出当前节点
   * 辅助方法
   * @param {*} item
   */
  find(item) {
    if (!this.head) {
      return null;
    }

    let currentNode = this.head;

    while (currentNode) {
      if (currentNode === item) {
        return currentNode;
      }
      currentNode = currentNode.next;
    }

    return null;
  }

  /**
   * 把新的节点插入到指定节点的后面
   * @param {*} newELement 插入的新节点
   * @param {*} item 插入元素的前一个节点值
   */
  insert(newELement) {
    let l = new Node(newELement);
    if (this.head === null) {
      this.head = l;
      this.tail = l;
    } else {
      this.tail.next = l;
      this.tail = l;
    }
  }

  /**
   * 移除节点
   * @param {*} item
   */
  remove(item) {
    if (!this.head) {
      return null;
    }

    let deletedNode = null;
    let currentNode = this.head;

    if (currentNode.element === item) {
      deletedNode = this.head;
      this.head = currentNode.next;
    }

    if (!deletedNode && currentNode !== null) {
      while (currentNode.next) {
        if (currentNode.next.element === item) {
          deletedNode = currentNode.next;
          currentNode.next = currentNode.next.next || null;
        } else {
          currentNode = currentNode.next;
        }
      }
    }

    return deletedNode;
  }

  /**
   * 显示所有节点数据
   */
  display() {
    let currentNode = this.head;

    while (currentNode) {
      console.log(currentNode.element);
      currentNode = currentNode.next;
    }
  }
}

// 创建一个 LinkedList 实例
let ll = new LinkedList();

// 插入一些元素
ll.insert('zhangsan');
ll.insert('lisi');
ll.insert('wangwu');
// ll.insert('lisi', '999');


ll.display();  // 显示元素，控制台输出 zhangsan,lisi,wangwu
ll.remove('zhangsan');
console.log("======================")
ll.display(); // 控制台输出 zhangsan,wangwu
